export namespace genericity {
    // Type的缩写，类型
  // pK、V：key和value的缩写，键值对
  // Element的缩写，元素
  // Object的缩写，对象

  // 泛型： 主要作用是可以使调用者自定义函数、类、对象的类型
  // function foo<Type>(arg: Type): Type {
  //   return arg
  // }

  // console.log(foo<number>(20))
  // console.log(foo<string>('coder'))

  // 泛型使用“+”时要对泛型进行类型约束   
  function foo1<T extends number>(arg1: T, arg2: T): number {
    return arg1 + arg2
  }

  foo1<number>(10, 20)

  // 泛型接口
  interface IFoo<T> {
    initialValue: T,
    valueList: T[],
    handleValue: (value: T) => void
  }

  const foo: IFoo<number> = {
    initialValue: 0,
    valueList: [1, 2, 3],
    handleValue: function (value: number) {
      console.log(`我是${typeof value}类型`)
    }
  }

  foo.handleValue(1)


  // 泛型类
  class Point<T> {
    x: T;
    y: T
    constructor(x: T, y: T) {
      this.x = x;
      this.y = y;
    }
  }
  // 创建一个对象实例
  const p1 = new Point(10, 20)
  // 创建一个泛型对象实例
  const p2 = new Point<number>(10, 20)
  // 创建一个类类型泛型对象实例
  const p3: Point<number> = new Point(10, 30)

  // 泛型类型约束
  interface ILength {
    length: number
  }

  function getLength<T extends ILength>(args: T) {
    return args.length
  }

  console.log(getLength('abc'))
  console.log(getLength([1, 2]))
  console.log(getLength({length: 10, name: '孙行者'}))
}